<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>高阶函数——函数柯里化</title>
</head>
<body>
  <div id="test"></div>

  <!-- 引入库：先引入核心库，再引入操作DOM的扩展库 -->
  <script type="text/javascript" src="../js/react.development.js"></script>
  <script type="text/javascript" src="../js/react-dom.development.js"></script>
  <!-- 将jsx转为js -->
  <script type="text/javascript" src="../js/babel.min.js"></script>
  <script type="text/babel">    //必须写babel，因为默认js
    class Login extends React.Component{
      /*
        高阶函数：如果一个函数符合下面2个规范中的任何一个，那该函数就是高级函数
          1. 若A函数，接收的参数是一个函数，那A就可以称为高阶函数
          2. 若A函数，调用的返回值依然是一个函数，那A就可以称为高阶函数
          常见的高阶函数：Promise、setTimeout、arr.map()等等

        函数的柯里化：通过函数调用继续返回函数的方式，实现多次接收参数最后统一处理的函数编码形式。
      */
      state = {
        username:'',
        password:''
      }

      saveFormData = (dataType)=>{
        return (event)=>{
          console.log(this)
          console.log(dataType,event.target.value)
          //dataType不加[]，react就会识别为一个字符串，会直接在state中创建dataType属性
          //此处类似dataType = 'username'，而[dataType]就是读取参数，而不会被认为是字符串
          this.setState({[dataType]:event.target.value})

        }
      }

      handleSubmit = (event)=>{
        event.preventDefault()
        console.log(this)
        const {username,password} = this.state
        alert(`你输入的用户名：${username}，密码：${password}`)
      }
      render(){
        return(
          <form onSubmit={this.handleSubmit}>
            {/*onChange={this.saveFormData这个加上()，就意味change调用了该函数的返回值，而不是调用该函数*/}
            <input onChange={this.saveFormData('username')} type="text" name="username"/>
            <input onChange={this.saveFormData('password')} type="password" name="password"/>
            <button>登录</button>
          </form>
        )
      }
    }

    ReactDOM.render(<Login/>, document.getElementById('test'))
  </script>
</body>
</html>